package example.annotate;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        getAll();
    }

    // 通过定义变量获取注解的属性值
    public static void getOne() {
        try {
            MyInsert insert = new MyInsert();

            // 获取类中指定的方法
            Method method = MyInsert.class.getMethod("insert");

            //检查方法上是否存在 @Insert 注解
            if(method.isAnnotationPresent(Insert.class)) {

                // 获取注解实例
                Insert annotation = method.getAnnotation(Insert.class);

                // 获取注解属性值
                String createBy = annotation.createBy();

                System.out.println(createBy);
            }

            insert.insert();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 通过反射遍历获取多个注解的属性值
    public static void getAll() {
        try {
            MyInsert insert = new MyInsert();

            // 获取类中指定的方法
            Method method = MyInsert.class.getMethod("allTest");

            // 检查方法上是否存在此注解
            if(method.isAnnotationPresent(All.class)) {

                // 获取注解实例
                All annotation = method.getAnnotation(All.class);

                // 有多个属性值，可以通过反射获取注解属性值
                Class<? extends Annotation> annotationType = annotation.annotationType();
                Method[] declaredMethods = annotationType.getDeclaredMethods();
                for (Method m : declaredMethods) {
                    try {
                        Object value = m.invoke(annotation);
                        System.out.println(m.getName() + ": " + value);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
